home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / SoundAndMusic / cmix / lpc / analysis / lpc.c < prev    next >
C/C++ Source or Header  |  1991-12-10  |  3KB  |  141 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <sys/file.h>
  4. #include <sys/param.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include "../../H/sfheader.h"
  8.  
  9. #define POLE_DEFAULT 24
  10. #define FRAMESIZE_DEFAULT 200
  11. char lpc_anal[MAXPATHLEN], unstable[MAXPATHLEN], soundfile[MAXPATHLEN];
  12. int poles = POLE_DEFAULT;
  13. int framesize = FRAMESIZE_DEFAULT;
  14. double inskip = 0;
  15. double duration;
  16. int durset = 0;
  17. int verbose = 0;
  18.  
  19. int first_frame = 1;
  20. int last_frame = 0;
  21.  
  22. main(ac,av)
  23. int ac;
  24. char *av[];
  25.     {
  26.     int i, valid_sf, sffd;
  27.     SFHEADER  sfh;
  28.     struct stat sfst;
  29.  
  30.     /* set up parameters by setting up defaults, reading args,
  31.     /* and overriding defaults as needed 
  32.     */
  33.  
  34.     /* have to have at least the nsame of the soundfile */
  35.     if(ac < 2)
  36.         usage();
  37.     strcpy(soundfile, av[ac-1]);
  38.     /* make sure it's valid, and find out the duration so we
  39.     /* can have a default duration 
  40.     */
  41.     //readopensf(soundfile, sffd, sfh, sfst, av[0], valid_sf);
  42.     drwopensf(soundfile, sffd, sfh, sfst, av[0], valid_sf,2);
  43.     close(sffd);
  44.     if(valid_sf < 0)
  45.         usage();
  46.     if(verbose)
  47.         printf("srate:%f chans:%d bsize:%d class:%d\n", 
  48.           sfsrate(&sfh),sfchans(&sfh),sfbsize(&sfst),sfclass(&sfh));
  49.     /* default duration - whole file */
  50.     duration=(double)sfbsize(&sfst)/(double)sfsrate(&sfh)/(double)sfchans(&sfh)/(double)sfclass(&sfh);
  51.     sprintf(lpc_anal, "%s.la", soundfile);
  52.     sprintf(unstable, "%s.uf", soundfile);
  53.     for(i = 1; i < ac && av[i][0] == '-'; i++)
  54.         {
  55.         if(strlen(av[i]) != 2)
  56.             usage();
  57.         if(i >= ac-1)
  58.             usage();
  59.         switch(av[i][1])
  60.             {
  61.             case 'v':
  62.              verbose = 1;
  63.              break;
  64.             case 'o':
  65.              strcpy(lpc_anal, av[++i]);
  66.              break;
  67.             case 'p':
  68.              poles = atoi(av[++i]);
  69.                  break;
  70.             case 'i':
  71.              inskip = atof(av[++i]);
  72.              break;
  73.             case 'd':
  74.              duration = atof(av[++i]);
  75.              durset = 1;
  76.              break;
  77.             case 'f':
  78.              framesize = atoi(av[++i]);
  79.              break;
  80.             default:
  81.              usage();
  82.              break;
  83.             }
  84.         }
  85.     /* 'cuz then the soundfile was not at the end */
  86.     if(i != ac-1)
  87.         usage();
  88.     /* now look - if we set inskip but let duration default, then we      
  89.     /* need to keep the durn thing from reading off the end 
  90.     */
  91.     if(inskip > 0.0 && !durset)
  92.         duration -= inskip;
  93.     create(lpc_anal);
  94.     create(unstable);
  95.     if((last_frame = anallpc(lpc_anal, soundfile, poles, framesize, inskip, duration,verbose)) < 0)
  96.         {
  97.         fprintf(stderr, "fatal error from anallpc\n");
  98.         fprintf(stderr, "BUT I'M GOING ON ANYWAY!\n");
  99.  
  100.         /* exit(-1); */
  101.         }
  102.     /*
  103.     rootst_(lpc_anal, unstable, &poles, &first_frame, &last_frame);
  104.     stabl_(lpc_anal, unstable, &poles);
  105.     unlink(unstable);
  106.     */
  107.     fprintf(stderr, "DONE\n");
  108.     }
  109.  
  110.  
  111.  
  112. usage()
  113.     {
  114.     char *use =
  115. "lpc [-o lpc_anal_file] [-p #poles] [-f framesize] \
  116. [-v] [-i inskip] [-d duration] soundfile\n\n\
  117. Defaults: soundfile.la for lpc_analysis file\n\
  118.       %d for number of poles\n\
  119.       %d for frame size\n\
  120.       non-verbose (use -v for verbose)\n\
  121.       0 for inskip (seconds to skip before readin soundfile)\n\
  122.       (length of file minus inskip) for duration\n";
  123.  
  124.     fprintf(stderr, use, POLE_DEFAULT, FRAMESIZE_DEFAULT);
  125.     exit(-1);
  126.     }
  127.  
  128. create(f)
  129. char *f;
  130.     {
  131.     FILE *fp = NULL;
  132.  
  133.     if((fp = fopen(f, "w")) == NULL)
  134.         {
  135.         perror(f);
  136.         usage();
  137.         }
  138.     fclose(fp);
  139.     }
  140.  
  141.